//引入路由
import router from './router'
//引入仓库
import store from './store'
//引入提示框
import { Message } from 'element-ui'
//进度条
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
//从cookie中获取token的，如果登录的话一定有token，没有登录就没有token
import { getToken } from '@/utils/auth' // get token from cookie
//获取页面标题
import getPageTitle from '@/utils/get-page-title'
//配置进度条
// 配置 NProgress（页面加载进度条库）的参数
NProgress.configure({
  easing: "ease",          // 进度条的动画效果，这里使用了 "ease"，表示平滑的增长
  speed: 500,              // 进度条的动画速度，以毫秒为单位，设置为 500ms，即半秒
  showSpinner: false,      // 是否显示加载进度条中的旋转图标，这里设置为 false 不显示
  trickleSpeed: 200,       // 进度条的增长速度，以毫秒为单位，设置为 200ms，即每0.2秒增加一次
  minimum: 0.3,            // 进度条的最小显示百分比，设置为 0.3，即加载达到 30% 时才显示
});

//白名单，不需要登录就可以直接访问
const whiteList = ['/login'] // no redirect whitelist
// 全局前置路由守卫
router.beforeEach(async(to, from, next) => {
  console.log('to',to)
  // 开始进度条
  NProgress.start()

  // 设置页面标题
  document.title = getPageTitle(to.meta.title)

  // 从cookie中获取token，如果有token就代表登录了
  const hasToken = getToken()

  //有token
  if (hasToken) {
    console.log('hasToken')
    //如果访问的是登录页
    if (to.path === '/login') {
      // console.log('access',accessRoutes)
      //直接跳转到首页
      next({ path: '/' })
      //关闭进度条
      NProgress.done() 
    } else {
      console.log('to  not login')
      //登录了但是去的是其他页面
      //store.getters.roles得到vuex中的角色，
      //如果登录了我们会去调用一个接口获取用户信息，在用户信息中有当前用户的角色
      //点击登录先发送登录请求服务器响应一个token前端将token存储到cookie中
      //就是说vuex中可以获取到用户角色的，通过store.getters.roles获取用户角色 store.getters.roles.length > 0 表示有角色
      const hasRoles = store.getters.roleList && store.getters.roleList.length > 0
      //获取到的角色（第一次登录没有role，一定会走else获取用户信息再拿到用户角色信息）
      if (hasRoles) {
        //直接放行
        next()
      } else {
        console.log('没有role')
        //没有角色信息
        try {
          //获取用户信息，获取角色信息
          const { roleList } = await store.dispatch('user/getInfo')
          //获取动态路由规则
          const accessRoutes = await store.dispatch('permission/generateRoutes')
          accessRoutes.push( {path: "/:pathMatch(.*)*",component: () => import("@/views/error/404.vue"),meta: {hidden: true,},})
          router.addRoutes(accessRoutes)
          next({ ...to, replace: true })
        } catch (error) {
          //如果生成规则过程中出现问题，清除token
          // remove token and go to login page to re-login
          await store.dispatch('user/resetToken')
          Message(
            {
              message: error || 'Has Error',
              type: 'error',
              duration: 5 * 1000
            }
          )
          //重新登录页面
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      }
    }
  } else {
    //没有token
    //是否访问白名单
    if (whiteList.indexOf(to.path) !== -1) {
      // 在白名单中放行
      next()
    } else {
      // 如果没有在白名单中就代表你访问的路由需要登录
      next(`/login?redirect=${to.path}`)
      //关闭登录条
      NProgress.done()
    }
  }
})
// 全局后置路由守卫
router.afterEach(() => {
  //关闭进度条
  NProgress.done()
})
